package org.wechat4j.api.tpl.message;

import com.alibaba.fastjson.JSON;
import org.wechat4j.config.ApiConfig;
import org.wechat4j.exception.MpInvokeException;
import org.wechat4j.model.Response;
import org.wechat4j.model.template.message.*;
import org.wechat4j.utils.Https;
import org.wechat4j.utils.ResponseUtils;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author bjliuyong
 * @version 1.0
 * @created date 16-11-8
 *
 * api.url http://mp.weixin.qq.com/wiki/17/304c1885ea66dbedf7dc170d84999a9d.html#.E8.AE.BE.E7.BD.AE.E6.89.80.E5.B1.9E.E8.A1.8C.E4.B8.9A
 *
 * https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1433751277&token=&lang=zh_CN
 *
 */
public abstract class TemplateMessageService {

    public final static String tplApiSetIndustryUrl     = ApiConfig.baseUrl + "template/api_set_industry?access_token=";
    public final static String getIndustryUrl           = ApiConfig.baseUrl + "template/get_industry?access_token=" ;
    public final static String apiAddTplurl             = ApiConfig.baseUrl + "template/api_add_template?access_token=";
    public final static String delPrivateTemplateUrl    = ApiConfig.baseUrl + "template/del_private_template?access_token=";
    public final static String sendTplMsgUrl            = ApiConfig.baseUrl + "message/template/send?access_token=" ;
    public final static String getAllPrivateTemplateUrl = ApiConfig.baseUrl + "template/get_all_private_template?access_token=";

    /**
     *
     *设置所属行业
     * @param industryId1
     * @param industryId2
     * @param accessToken
     * @throws MpInvokeException
     * @return
     */
    public static void apiSetIndustry(int industryId1 , int industryId2 ,String accessToken) throws MpInvokeException{
        Map<String ,Integer> data = new HashMap<String,Integer>(2);
        data.put("industry_id1",industryId1);
        data.put("industry_id2",industryId2);

        String requestUrl = tplApiSetIndustryUrl + accessToken  ;

        /**
         * {"errcode":43100,"errmsg":"change template too frequently"}
         */
        String content    = Https.post(requestUrl, JSON.toJSONString(data), null);

        ResponseUtils.parse(content , Response.class);
    }

    /**
     * 获取设置的行业信息
     * 获取帐号设置的行业信息。可在MP官网中查看行业信息，为方便第三方开发者，提供通过接口调用的方式来获取帐号所设置的行业信息，具体如下:
     * @param accessToken
     * @throws MpInvokeException
     * @return
     */
    public static Industry getIndustry(String accessToken) throws MpInvokeException{
        String requestUrl = getIndustryUrl + accessToken  ;
        String content = Https.get(requestUrl , null) ;
        return  ResponseUtils.parse(content, Industry.class) ;
    }

    /**
     * 删除模板
     * 删除模板可在MP中完成，为方便第三方开发者，提供通过接口调用的方式来删除某帐号下的模板
     * @param accessToken
     * @throws MpInvokeException
     * @return
     */
    public static void delPrivateTemplate(String templateId ,String accessToken) throws MpInvokeException{
        String requestUrl = delPrivateTemplateUrl + accessToken  ;
        String postData  = "{\"template_id\":\"" + templateId + "\"}";
        String content = Https.post(requestUrl, postData, null) ;
        ResponseUtils.parse(content, Response.class) ;
    }

    /**
     * 获取模板列表
     *
     * 获取已添加至帐号下所有模板列表，可在MP中查看模板列表信息，为方便第三方开发者，提供通过接口调用的方式来获取帐号下所有模板信息，具体如下:
     *
     * @param accessToken
     * @return
     *
     * 正确调用后的返回示例：
     *
     * {
     *  "template_list": [{
     *  "template_id": "iPk5sOIt5X_flOVKn5GrTFpncEYTojx6ddbt8WYoV5s",
     *  "title": "领取奖金提醒",
     *  "primary_industry": "IT科技",
     *  "deputy_industry": "互联网|电子商务",
     *  "content": "{ {result.DATA} }\n\n领奖金额:{ {withdrawMoney.DATA} }\n领奖  时间:{ {withdrawTime.DATA} }\n银行信息:{ {cardInfo.DATA} }\n到账时间:  { {arrivedTime.DATA} }\n{ {remark.DATA} }",
     *  "example": "您已提交领奖申请\n\n领奖金额：xxxx元\n领奖时间：2013-10-10 12:22:22\n银行信息：xx银行(尾号xxxx)\n到账时间：预计xxxxxxx\n\n预计将于xxxx到达您的银行卡"
     *  }]
     * }
     *  返回参数说明
     *  参数	             是否必填  说明
     *  template_id	        是    模板ID
     *  title	            是    模板标题
     *  primary_industry	是    模板所属行业的一级行业
     *  deputy_industry	    是    模板所属行业的二级行业
     *  content	            是    模板内容
     *  example	            是    模板示例
     */
    public static List<Template> getAllPrivateTemplate(String accessToken) throws MpInvokeException{
        String requestUrl = getAllPrivateTemplateUrl + accessToken ;
        String content    =  Https.get(requestUrl , null) ;
        return ((TemplateListResponse)ResponseUtils.parse(content , TemplateListResponse.class)).template_list ;
    }


    /**
     ** 获得模板ID
     *
     * 正常时的返回JSON数据包示例：
     * {"errcode":0,"errmsg":"ok","template_id":"Oxe8rW3Jv5yPwQz09JS9MlaSCVmMJ6n7dXJdUVDf2TI"}
     *
     * @param templateIdShort
     * @param accessToken
     * @return
     * @throws MpInvokeException
     */
    public static String apiAddTemplate(String templateIdShort ,String accessToken) throws MpInvokeException {
        /**
         * POST data :
         * {
         *  "template_id_short":"TM00015"
         * }
         *
         */
        String jsonData = "{\"template_id_short\":\"" + templateIdShort +"\"}";
        String requestUrl = apiAddTplurl + accessToken ;

        String content = Https.post(requestUrl, jsonData , null);
        return ((TemplateIdResponse)ResponseUtils.parse(content ,TemplateIdResponse.class)).template_id;
    }

    /**
     * {"errcode":40003,"errmsg":"invalid openid hint: [w60623ge12]"}
     * {"errcode":40037,"errmsg":"invalid template_id hint: [OPXyoA0299age6]"}
     *
     * @param templateMessage
     * @param accessToken
     * @return msgId
     */
    public static String send(TemplateMessage templateMessage ,String accessToken) throws MpInvokeException {

        String requestUrl = sendTplMsgUrl + accessToken;
        String content = Https.post(requestUrl, JSON.toJSONString(templateMessage) , null);
        return  ((MsgIdResponse)ResponseUtils.parse(content, MsgIdResponse.class)).msgid;
    }

    static class TemplateIdResponse extends Response {
        public String template_id  ;
    }

    static class TemplateListResponse extends Response {
        public List<Template> template_list ;
    }

    static class MsgIdResponse extends Response {
        public String msgid ;
    }
}

/**
 * 模板 内容说明
 *
 * 编号OPENTM200698500
 * 标题投诉结果
 * 行业政府与公共事业 - 政府|公共事业|非盈利机构
 * 详细内容
 *
 * {{first.DATA}}
 * 投诉对象：{{keyword1.DATA}}
 * 投诉时间：{{keyword2.DATA}}
 * 处理情况：{{keyword3.DATA}}
 * 咨询电话：{{keyword4.DATA}}
 * {{remark.DATA}}
 *
 * 内容示例
 *
 * 您好，您的投诉已处理。具体信息如下：
 * 投诉对象：厦门软件园二期
 * 投诉时间：2014/08/28 15:00:00
 * 处理情况：已处理
 * 咨询电话：0592-8888888
 * 感谢您的反馈
 *
 */
